package com.kongjs.application.util;

import com.fasterxml.jackson.core.type.TypeReference;
import com.kongjs.application.model.entity.Comments;
import com.kongjs.common.rest.util.JsonUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.CollectionUtils;

import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CommentsTreeBuilder {

    /**
     * 将扁平的评论列表转换为树形结构
     *
     * @param commentsList 扁平的评论列表
     * @return 根评论列表（带子评论）
     */
    public static List<Comments> buildTree(List<Comments> commentsList) {
        // 用于快速查找评论的Map（key: 评论ID，value: 评论对象）
        Map<Long, Comments> commentsMap = new HashMap<>();
        // 根评论列表（parentId为null或0）
        List<Comments> rootCommentss = new ArrayList<>();

        // 1. 先将所有评论放入Map中，便于快速查找
        for (Comments comments : commentsList) {
            commentsMap.put(comments.getCommentId(), comments);
        }

        // 2. 构建树结构
        for (Comments comments : commentsList) {
            Long parentId = comments.getCommentParent();

            // 如果parentId为null或0，表示根评论
            if (parentId == null || parentId == 0) {
                rootCommentss.add(comments);
            } else {
                // 否则，将当前评论添加到其父评论的children列表中
                Comments parentComments = commentsMap.get(parentId);
                if (parentComments != null) {
                    if (CollectionUtils.isEmpty(parentComments.getChildren())) {
                        parentComments.setChildren(new ArrayList<>());
                    }
                    parentComments.getChildren().add(comments);
                }
            }
        }

        // 3. 对子评论进行排序（可选，根据需求调整）
        sortComments(rootCommentss);

        return rootCommentss;
    }

    /**
     * 递归排序评论树（按时间倒序）
     */
    private static void sortComments(List<Comments> commentsList) {
        if (CollectionUtils.isEmpty(commentsList)){
            return;
        }
        // 按评论时间倒序排序（最新的在前）
        commentsList.sort((c1, c2) -> c2.getCommentDate().compareTo(c1.getCommentDate()));

        // 递归排序子评论
        for (Comments comments : commentsList) {
            sortComments(comments.getChildren());
        }
    }

    public static List<Comments> getTestComments() {
        String contentAsString;
        try {
            contentAsString = new ClassPathResource("testComments.json").getContentAsString(StandardCharsets.UTF_8);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return JsonUtils.fromJson(contentAsString, new TypeReference<>() {
            @Override
            public Type getType() {
                return super.getType();
            }
        });
    }
}
